package org.codeart.interpreter.example01;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 表达式解释器
 */
public class ExpressionInterpreter {

    // 双端队列
    private final Deque<Long> numbers = new LinkedList<>();

    public long interpret(String expression) {
        String[] elements = expression.split(" ");
        int n = elements.length;
        // 获取表达式中的数字
        for (int i = 0; i < (n + 1) / 2; i++) {
            // 向集合尾部添加元素
            numbers.addLast(Long.parseLong(elements[i]));
        }

        // 获取表达式中的符号 进行计算
        for (int i = (n + 1) / 2; i < n; i++) {
            String op = elements[i];
            // 符号必须是 + - * / 否则抛出异常
            boolean isValid = "+".equals(op) || "-".equals(op) || "*".equals(op) || "/".equals(op);
            if (!isValid) {
                throw new RuntimeException("invalid expression: " + expression);
            }
            
            // 获取集合中的数字 移除集合中的第一个元素 并且返回被移除的值
            long number1 = numbers.pollFirst();
            long number2 = numbers.pollFirst();
            
            long result = 0;
            switch (op) {
                case "+":
                    result = number1 + number2;
                    break;
                case "-":
                    result = number1 - number2;
                    break;
                case "*":
                    result = number1 * number2;
                    break;
                case "/":
                    result = number1 / number2;
                    break;
            }
            
            // 将运算结果添加到头部
            numbers.addFirst(result);
        }
        
        // 运算的最终结果是被保存到集合中
        if (numbers.size() != 1) {
            throw new RuntimeException("invalid expression: " + expression);
        }

        return numbers.pollFirst();
    }
}
